package com.easyfun.healthmagicbox.util;

import java.sql.Timestamp;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;

public class HealthDateUtil {
	public static final String[] months = { "一月", "二月", "三月", "四月", "五月", "六月",
			"七月", "八月", "九月", "十月", "十一月", "十二月", };
	public static final String[] quarters = { "一季度", "二季度", "三季度", "四季度" };

	public HealthDateUtil() {
	}

	/**
	 * 获取日期字符串。
	 * 
	 * <pre>
	 *  日期字符串格式： yyyyMMdd
	 *  其中：
	 *      yyyy   表示4位年。
	 *      MM     表示2位月。
	 *      dd     表示2位日。
	 * </pre>
	 * 
	 * @return String "yyyyMMdd"格式的日期字符串。
	 */
	public static String getDate() {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
		return formatter.format(new Date());
	}

	/**
	 * 获取当前年度字符串。
	 * 
	 * <pre>
	 *  日期字符串格式： yyyy
	 *  其中：
	 *      yyyy   表示4位年。
	 * </pre>
	 * 
	 * @return String "yyyy"格式的当前年度字符串。
	 */
	public static String getNowYear() {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
		return formatter.format(new Date());
	}

	/**
	 * 获取当前月度字符串。
	 * 
	 * <pre>
	 *  日期字符串格式： MM
	 *  其中：
	 *      MM   表示4位年。
	 * </pre>
	 * 
	 * @return String "yyyy"格式的当前月度字符串。
	 */
	public static String getNowMonth() {
		SimpleDateFormat formatter = new SimpleDateFormat("MM");
		return formatter.format(new Date());
	}

	/**
	 * 获取当前月度字符串。
	 * 
	 * <pre>
	 *  日期字符串格式： dd
	 *  其中：
	 *      dd   表示4位年。
	 * </pre>
	 * 
	 * @return String "yyyy"格式的当前月度字符串。
	 */
	public static String getNowDay() {
		SimpleDateFormat formatter = new SimpleDateFormat("dd");
		return formatter.format(new Date());
	}

	/**
	 * 获取日期字符串。
	 * 
	 * <pre>
	 *  日期字符串格式： yyyyMMdd
	 *  其中：
	 *      yyyy   表示4位年。
	 *      MM     表示2位月。
	 *      dd     表示2位日。
	 * </pre>
	 * 
	 * @param date
	 *            需要转化的日期。
	 * @return String "yyyyMMdd"格式的日期字符串。
	 */
	public static String getDate(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		return formatter.format(date);
	}

	/**
	 * 获取日期字符串。
	 * 
	 * <pre>
	 *  日期字符串格式： yyyy-MM-dd
	 *  其中：
	 *      yyyy   表示4位年。
	 *      MM     表示2位月。
	 *      dd     表示2位日。
	 * </pre>
	 * 
	 * @return String "yyyy-MM-dd"格式的日期字符串。
	 */
	public static String getHyphenDate() {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		return formatter.format(new Date());
	}

	/**
	 * 获取日期字符串。
	 * 
	 * <pre>
	 *  日期字符串格式： yyyy-MM-dd
	 *  其中：
	 *      yyyy   表示4位年。
	 *      MM     表示2位月。
	 *      dd     表示2位日。
	 * </pre>
	 * 
	 * @param date
	 *            需要转化的日期。
	 * @return String "yyyy-MM-dd"格式的日期字符串。
	 */
	public static String getHyphenDate(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		return formatter.format(date);
	}

	/**
	 * 将"yyyyMMdd"格式的日期字符串转换为日期对象。
	 * 
	 * @param source
	 *            日期字符串。
	 * @return Date 日期对象。
	 */
	public static Date parsePlainDate(String source) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		return sdf.parse(source, new ParsePosition(0));
	}

	/**
	 * 将“yyyy-MM-dd”格式的日期字符串转换为日期对象。
	 * 
	 * @param source
	 *            日期字符串。
	 * @return Date 日期对象。
	 */
	public static Date parseHyphenDate(String source) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.parse(source, new ParsePosition(0));
	}

	/**
	 * 将指定格式的日期字符串转换为日期对象。
	 * 
	 * @param source
	 *            日期字符串。
	 * @param pattern
	 *            模式。
	 * @return Date 日期对象。
	 */
	public static Date parseDate(String source, String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.parse(source, new ParsePosition(0));
	}

	/**
	 * 将“yyyy-MM-dd”格式的日期字符串转换为“yyyyMMdd”格式的日期字符串。
	 * 
	 * @param source
	 *            日期字符串。
	 * @return String "yyyymmdd"格式的日期字符串。
	 */
	public static String toPlainDate(String source) {
		Date date = parseHyphenDate(source);
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
		return formatter.format(date);
	}

	/**
	 * 将“yyyyMMdd”格式的日期字符串转换为“yyyy-MM-dd”格式的日期字符串。
	 * 
	 * @param source
	 *            日期字符串。
	 * @return String "yyyy-MM-dd"格式的日期字符串。
	 */
	public static String toHyphenDate(String source) {
		Date date = parsePlainDate(source);
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		return formatter.format(date);
	}

	/**
	 * 获取时间戳，将日期对象转换为时间戳类型。
	 * 
	 * @param date
	 *            日期对象
	 * @return Timestamp 时间戳
	 */
	public static Timestamp getTimestamp(Date date) {
		return new Timestamp(date.getTime());
	}

	/**
	 * 获取时间戳，将当前日期转换为时间戳类型。
	 * 
	 * @return Timestamp 时间戳
	 */
	public static Timestamp getTimestamp() {
		return new Timestamp(new Date().getTime());
	}

	/**
	 * 将“yyyyMMdd”格式的日期字符串转换为Timestamp类型的对象。
	 * 
	 * @param source
	 *            日期字符串
	 * @return Timestamp 时间戳
	 */
	public static Timestamp parseTimestamp(String source) {
		Date date = parsePlainDate(source);
		return getTimestamp(date);
	}

	/**
	 * 获得年度周期 <br>
	 * Example:<br>
	 * XJPDateUtil.getPeriodYear("20040229" , -1);<br>
	 * XJPDateUtil.getPeriodYear("20040228" , -1);<br>
	 * XJPDateUtil.getPeriodYear("20020230" , 2);<br>
	 * 
	 * @param source
	 *            时间串
	 * @param yearPeriod
	 *            年度周期 -1代表本时间的上一年度,以次类推。
	 * @return String 时间。
	 */
	public static String getPeriodYear(String source, int yearPeriod) {
		int p = Integer.parseInt(source.substring(0, 4)) + yearPeriod;
		String newYear = String.valueOf(p)
				+ source.substring(4, source.length());
		Date date = parsePlainDate(newYear);
		String s = getDate(date);
		int ny = Integer.parseInt(s);
		int sy = Integer.parseInt(newYear);
		while (ny > sy) {
			sy--;
			ny = Integer.parseInt(getDate(parsePlainDate(String.valueOf(sy))));
		}
		return String.valueOf(sy);
	}

	/**
	 * 获取当前日期和时间
	 * 
	 * @return String
	 */
	public static String getCurrentDateStr(String format) {
		
		Date date = new Date();
		String str = null;
		SimpleDateFormat df;
		if ((format ==null)||(format.length()==0))
			df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		else
			df = new SimpleDateFormat(format);
		str = df.format(date);
		return str;
	}

	/**
	 * 日期相加
	 * 
	 * @param day
	 *            天数
	 * @return 返回相加后的日期
	 */
	public static String addDate(int day) {
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTimeInMillis(System.currentTimeMillis() + ((long) day) * 24 * 3600
				* 1000);
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
		return df.format(c.getTime());
	}

	/**
	 * 返回毫秒
	 * 
	 * @param date
	 *            日期
	 * @return 返回毫秒
	 */
	public static long getMillis(java.util.Date date) {
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTime(date);
		return c.getTimeInMillis();
	}

	/**
	 * 获取当前日期和时间
	 * 
	 * @param format
	 *            日期格式 例：yyyy-MM-dd hh:mm
	 * @return String
	 */
	public static String getNowDate(String format) {
		Date date = new Date();
		String str = null;
		SimpleDateFormat df = new SimpleDateFormat(format);
		str = df.format(date);
		return str;
	}


	/**
	 * 将“yyyy-MM-dd”格式的日期字符串转换为日期对象。
	 * 
	 * @param source
	 *            日期字符串。
	 * @return Date 日期对象。
	 */
	public static String formatDate(Date date ,String format) {
		String str = null;
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		str = sdf.format(date);
		return str;
	}
	/**
	 * 将strmon的日期减小一个月
	 * 
	 * @param mon
	 * @return
	 */
	public static String getReduceMonDate(String strmon) {
		if (strmon != null && !strmon.equals("")) {
			Date mon = parseHyphenDate(strmon);
			mon.setMonth(mon.getMonth() - 1);
			return getHyphenDate(mon);
		} else {
			return "";
		}
	}

	public static String getTimeStr(String dateStr) {
		Date date = getDate(dateStr,null);
		String str = null;
		SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
		str = df.format(date);
		return str;
	}

	public static String getTimeStr() {
		String str = "";
		SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
		str = df.format(new Date());
		return str;
	}
	
	public static String getAlarmTimeStr(Date date) {
		String str = "";
		SimpleDateFormat df = new SimpleDateFormat("HH:mm");
		str = df.format(date);
		return str;
	}

	/**
	 * 获取日期字符串。
	 * 
	 * <pre>
	 *  日期字符串格式： yyyyMMdd
	 *  其中：
	 *      yyyy   表示4位年。
	 *      MM     表示2位月。
	 *      dd     表示2位日。
	 * </pre>
	 * 
	 * @param date
	 *            需要转化的日期。
	 * @return String "yyyyMMdd"格式的日期字符串。
	 */
	/**
	 * 将指定的日期字符串转化为日期对象
	 * 
	 * @param dateStr
	 *            日期字符串
	 * @return java.util.Date
	 * @roseuid 3F39FE450385
	 */
	public static Date getDate(String dateStr, String formatStr) {
		if (dateStr.indexOf(":")==-1) { // 日期型
			SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
			try {
				java.util.Date date = df.parse(dateStr);
				return date;
			} catch (Exception ex) {
				
				return null;
			} // end try - catch
		} else if (dateStr.indexOf(":")>-1) 
		{ // 日期时间型
			SimpleDateFormat df = new SimpleDateFormat(
					formatStr==null?"yyyy-MM-dd HH:mm:ss.SSS":formatStr);
			try {
				java.util.Date date = df.parse(dateStr);
				return date;
			} catch (Exception ex) {
				return null;
			} // end try - catch
		} // end if
		return null;
	}
}